home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / DiskUtil / Misc / DiskSpare / Support / QuietTD.asm < prev    next >
Assembly Source File  |  1994-11-13  |  3KB  |  207 lines

  1.  
  2.     *** QuietTD 1.0 ***
  3.     *** Klaus 4.8.94 ***
  4.     
  5.     incdir    "work:coding/asm_include/"
  6.     include    "devices/trackdisk.i"
  7.  
  8. push    macro
  9.     movem.l    \1,-(sp)
  10.     endm
  11. pull    macro
  12.     movem.l    (sp)+,\1
  13.     endm
  14.  
  15. sync        =    $4489
  16. dmalen        =    $2000        ;more than enough
  17.  
  18. start
  19.     move.l    4.w,a6
  20.     cmp    #36,$14(a6)        ;version
  21.     blt    ende    
  22.     lea    ioreq,a2
  23. l0
  24.     lea    tdname,a0
  25.     moveq    #0,d0        ;unit
  26.     moveq    #0,d1        ;flags
  27.     bsr    OpenDevice
  28.     tst.l    d0
  29.     bne    ende
  30.     move.l    IO_DEVICE(a2),a3    ;adr.
  31.     bsr    CloseDevice
  32.     move.l    -28(a3),jmpadr1+2
  33.     move.l    -28(a3),jmpadr2+2    ;beginio
  34.     
  35.     move.l    4.w,a6
  36.     move.l    #patche-patch,d0
  37.     moveq    #1,d1
  38.     jsr    -198(a6)        ;allocmem
  39.     move.l    d0,d2
  40.     beq.s    ende
  41.     move.l    d0,a1
  42.     lea    patch,a0
  43.     move.l    #patche-patch,d0
  44.     jsr    -624(a6)        ;copymem
  45.     
  46.     jsr    -132(a6)        ;forbid
  47.     move.l    d2,-28(a3)        ;set patch
  48.     jsr    -138(a6)        ;permit
  49.     
  50. ende
  51.     moveq    #0,d0
  52.     rts
  53.     
  54. patch
  55.     push    d0-a6
  56.     cmp    #CMD_READ,IO_COMMAND(a1)
  57.     bne    pe
  58.     tst.l    IO_OFFSET(a1)        ;block 0 ?
  59.     bne    pe
  60.     bsr    getmem
  61.     tst.l    d2
  62.     beq    pe            ;out of mem
  63.     move.l    d2,a5
  64.     move.l    d2,a0
  65.     move.l    a1,a4
  66.     moveq    #IOSTD_SIZE-1,d0
  67. 1$
  68.     move.b    (a1)+,(a0)+        ;copy io-req
  69.     dbf    d0,1$
  70.     
  71.     move.l    a4,a1
  72.     move    #TD_RAWREAD,IO_COMMAND(a1)
  73.     moveq    #1,d0            ;quick
  74.     bset    #IOTDB_WORDSYNC,d0
  75.     move.b    d0,IO_FLAGS(a1)
  76.     move.l    #dmalen,IO_LENGTH(a1)
  77.     lea    IOSTD_SIZE(a5),a0
  78.     move.l    a0,IO_DATA(a1)        ;adr.
  79.     move.l    IO_DEVICE(a1),a6
  80. jmpadr1        
  81.     jsr    0.l            ;beginio
  82.     move.l    a4,a1
  83.     move.l    4.w,a6
  84.     jsr    -474(a6)        ;waitio
  85.     moveq    #0,d0
  86.     move.b    IO_ERROR(a4),d0        ;io_error
  87.     cmp.l    #TDERR_NoSecHdr,d0
  88.     beq.s    pme            ;disk not formatted or drive error
  89.     
  90.     lea    IOSTD_SIZE(a5),a0
  91.     move    #dmalen/4-1,d0
  92. l1
  93.     cmp.l    #$4489552A,(a0)+    ;first long in block
  94.     beq.s    pme            ;td track -> let it read
  95.     dbf    d0,l1
  96.     move.l    a5,a0
  97.     move.l    a4,a1
  98.     moveq    #IOSTD_SIZE-1,d0
  99. 1$
  100.     move.b    (a0)+,(a1)+        ;copy back io-req
  101.     dbf    d0,1$
  102.     bsr    freemem
  103.     
  104.     move.b    #TDERR_NoSecHdr,IO_ERROR(a4)
  105.     
  106. 2$
  107.     pull    d0-a6
  108.     moveq    #0,d0            ;roger
  109.     move.b    IO_ERROR(a1),d0
  110.     ext    d0
  111.     ext.l    d0
  112.     rts
  113.     
  114. pme
  115.     move.l    a5,a0
  116.     move.l    a4,a1
  117.     moveq    #IOSTD_SIZE-1,d0
  118. 1$
  119.     move.b    (a0)+,(a1)+        ;copy back io-req
  120.     dbf    d0,1$
  121.     bsr.s    freemem            ;ioreq + buffer
  122. pe
  123.     pull    d0-a6
  124. jmpadr2
  125.     jmp    0.l
  126.     
  127. getmem
  128.     push    d0-1/a0-1/a6
  129.     move.l    4.w,a6
  130.     move.l    #dmalen+IOSTD_SIZE,d0
  131.     move.l    #$10002,d1        ;chip + clear
  132.     jsr    -198(a6)        ;allocmem
  133.     move.l    d0,d2
  134.     pull    d0-1/a0-1/a6
  135.     rts
  136.     
  137. freemem
  138.     push    d0-1/a0-1/a6
  139.     move.l    4.w,a6
  140.     move.l    #dmalen+IOSTD_SIZE,d0
  141.     move.l    a5,a1
  142.     jsr    -210(a6)        ;freemem
  143.     pull    d0-1/a0-1/a6
  144.     rts
  145.     
  146. patche
  147.  
  148. *-------
  149.  
  150. *    D0    =    Unitnummer
  151. *    D1    =    Flags
  152. *    A0    =    Devicename
  153.  
  154. OpenDevice
  155.     push    d1-a6
  156.     move.l    d0,d2
  157.     move.l    d1,d3
  158.     move.l    a0,a2
  159.     move.l    4.w,a6
  160.     sub.l    a1,a1
  161.     jsr    -294(a6)        ;findtask
  162.     move.l    d0,myport+$10
  163.     lea    myport,a1
  164.     move.l    d0,$10(a1)        ;in port
  165.     jsr    -354(a6)        ;addport
  166.     move.l    d2,d0            ;unit
  167.     move.l    d3,d1            ;flags
  168.     move.l    a2,a0            ;name
  169.     lea    ioreq,a1        ;ioreq
  170.     jsr    -444(a6)        ;opendevice
  171.     tst.l    d0
  172.     beq.s    1$            ;fehler
  173.     move.l    d0,d2
  174.     lea    myport,a1
  175.     jsr    -360(a6)        ;remport
  176.     move.l    d2,d0
  177.     bra.s    2$
  178. 1$
  179.     lea    ioreq,a1
  180.     move.l    #myport,14(a1)        ;port eintragen
  181. 2$
  182.     pull    d1-a6
  183.     rts
  184.  
  185. *-------
  186.  
  187. CloseDevice
  188.     push    d0-a6
  189.     move.l    4.w,a6
  190.     lea    ioreq,a1
  191.     jsr    -450(a6)        ;closedevice
  192.     lea    myport,a1
  193.     jsr    -360(a6)        ;remport
  194.     pull    d0-a6
  195.     rts
  196.  
  197.  cnop    0,4
  198.  
  199. ioreq    ds.l    IOSTD_SIZE    ;ioreq
  200. myport    ds.l    8        ;msgport
  201. dosbase    dc.l    0
  202.  
  203. tdname    dc.b    "trackdisk.device",0
  204. dosname    dc.b    "dos.library",0
  205.  
  206.     end
  207.